/*
 * @title instruction.h
 * @brief Instructions
 * @author Nathalie Kauv & Laura Martellotto
 *
 * @date 27 déc. 2011
 *
 */

#ifndef INSTRUCTIONS_H
#define INSTRUCTIONS_H


#include "traitement.h"

#define TAILLE_INST 10000

mot programme [TAILLE_INST];
unsigned instCourant;


/**
 * @brief Permet d'initialiser le tableau de mot appelé programme
 *
 * @param codInst est le mot qui se rajoutera dans programme lorsqu'il sera initialisé
 * @param rang est le rang à partir du quel la chaine de caractère inst n'a pas été
 *          parcouru
 * @param inst est la chaine de caractère lu dans le fichier
 *
 * Parcours le mot pour obtenir le codage de la source lorsque le mode
 * d'opération est Immédiat ou Direct. Ensuite, il enregistre le mot
 * dans le tableau de mot programme.
 */
void parSourImmDir(mot codInst, int rang, char * inst);

/**
 * @brief Permet d'initialiser le tableau de mot appelé programme
 *
 * @param codInst est le mot qui se rajoutera dans programme lorsqu'il sera initialisé
 * @param rang est le rang à partir du quel la chaine de caractère inst n'a pas été
 *          parcouru
 * @param inst est la chaine de caractère lu dans le fichier
 *
 * Parcours le mot pour obtenir le codage de la source lorsque le mode
 * d'opération est Registre ou Indirect. Ensuite, il enregistre le mot
 * dans le tableau de mot programme.
 */
void parSourRegInd(mot codInst, int rang, char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est load.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage pour la
 * destination est un registre, et la source est direct, indirect ou immédiat.
 * Elle initialise ainsi le mode opératoire et le code du mot. Elle peut
 * initialiser un deuxième mot lorsque le mode d'opératoire est immédiat ou direct.
 * Elle peut même initialiser un troisième lorsqu'il est immédiat et direct.
 */
void traitLoad (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est store.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage pour la
 * destination est un registre, et la source est direct, indirect ou immédiat.
 * Elle initialise ainsi le mode opératoire et le code du mot. Elle peut
 * initialiser un deuxième mot lorsque le mode d'opératoire est immédiat ou direct.
 * Elle peut même initialiser un troisième lorsqu'il est immédiat et direct.
 */
void traitStore (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est add.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage est pour la
 * destination, un registre, et la source peut être registre, direct, indirect ou
 * immédiat. Elle initialise ainsi le mode opératoire et le code du mot.
 */
void traitAdd (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est sub.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage est pour la
 * destination, un registre, et la source peut être registre, direct, indirect ou
 * immédiat. Elle initialise ainsi le mode opératoire et le code du mot.
 */
void traitSub (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est jmp.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage la
 * source est immédiat. Elle initialise ainsi le mode opératoire et le code du mot.
 * Elle peut initialiser un deuxième mot lorsque le mode d'opératoire est
 * immédiat
 */
void traitJmp (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est jeq.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage la
 * source est immédiat. Elle initialise ainsi le mode opératoire et le code du mot.
 * Elle peut initialiser un deuxième mot lorsque le mode d'opératoire est
 * immédiat
 */
void traitJeq (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est call.
 * Elle parcourt inst pour initisialiser le mot. Le mode d'adressage la
 * source est immédiat. Elle initialise ainsi le mode opératoire et le code du mot.
 * Elle peut initialiser un deuxième mot lorsque le mode d'opératoire est
 * immédiat.
 */
void traitCall (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est jeq.
 * Elle parcourt inst pour initisialiser le mot. Mais, elle n'a pas de mode
 * d'adressage. Elle initialise aucun mode opératoire et code du mot.
 */
void traitRet (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est push.
 * Elle parcourt inst pour initisialiser le mot. Mais, elle le mode
 * d'adressage, en source peut être soit registre, immédiat, direct ou
 * indirect. Elle initialise ainsi le mode opératoire et le code du mot.
 * Elle peut initialiserun deuxième mot lorsque le mode d'opératoire est
 * direct.
 */
void traitPush (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est pop.
 * Elle parcourt inst pour initisialiser le mot. Mais, elle le mode
 * d'adressage, en destination peut être soit registre, direct ou
 * indirect. Elle initialise ainsi le mode opératoire et le code du mot.
 * Elle peut initialiserun deuxième mot lorsque le mode d'opératoire est
 * direct.
 */
void traitPop (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Fait le traitement lorsque l'instruction lue dans le fichier est halt,
 * pour arreter le programme. Elle parcourt inst pour initisialiser le mot.
 * Mais, le mode d'adressage, le code et le mode opératoire ne sont pas
 * initialisé.
 */
void traitHalt (char * inst);

/**
 * @brief Initialise le codage du mot
 *
 * @param inst la chaine de caractère lue dans le fichier
 *
 * Essaye de transformer la chaine lue dans le fichier en mot, en appelant les
 * fonctions trait*. Elle permet de reconnaitre les instructions.
 */
void transMot (char * inst);

/**
 * @brief Lit le fichier pour initialiser un mot stocké dans programme, un tableau.
 *
 * Lit le fichier fix.txt, où toutes les instructions de procsi attendent
 * d'être exécuté. Il lit ligne par ligne, jusqu'à qu'il en trouve plus.
 * Il ferme le fichier et lance la fonction lancerProgramme(), qui lira sur le
 * tableau pour obtenir le résultat des instructions.
 */
void Read ();

/**
 * @brief Ecrit sur le fichier fic.txt les instructions à exécuter
 *
 * Cette fonction permet d'écrire dans le fichier fic.txt les instructions que
 * l'on souhaite exécuter.
 */
void Write();

#endif
